package chapter01;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

class user
{
    private String name;
    private int age;
}

public class reflect {
    public static void main(String[] args) {
        user us;
        String name = "java.lang.Double";
        try
        {
            Class cl = Class.forName(name);  //获取name的类,不是对象是类
            Class supercl = cl.getSuperclass();  //获取name的父类
            String modifiers = Modifier.toString(cl.getModifiers()); //把cl的类修饰符转成字符串
            //有修饰符修饰的情况
            if(modifiers.length() > 0) System.out.print(modifiers + " ");
            System.out.print("class "+ name) ; //打印类名

            //如果supercl不等于空，且不等于Object，说明cl没有直接Objcet，而是supercl
            if(supercl != null && supercl != Object.class)
                System.out.print(" extends " + supercl.getName()); //打印父类的类名

            System.out.println("\n{"); //打印换行加花括号
            printConstructors(cl) ; //打印cl的所有构造函数
            System.out.println();
            printMethods(cl); //打印cl类的所有成员方法
            System.out.println();
            printFields(cl); //打印cl的所有成员变量
            System.out.println();
        }catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
    }
    //
    public static void printConstructors(Class cl)
    {
        Constructor[] constructors = cl.getConstructors(); //获取cl的所有构造函数对象
        for(Constructor con : constructors)
        {
            String name = con.getName(); //获取con方法名
            System.out.println("    ");
            String modifiers = Modifier.toString(con.getModifiers());//获取con的修饰符并转成字符串
            if(modifiers.length() > 0) System.out.print(modifiers + " "); //有修饰符修饰则打印
            System.out.print(name + "(");

            Class[] paramTypes = con.getParameterTypes(); //获取所有参数，
            for(int i = 0 ; i < paramTypes.length ;  i++)
            {
                if(i > 0 ) System.out.println(","); //如果参数在第二个以上，加上逗号
                System.out.print(paramTypes[i].getName()); // 打印参数类型
            }
            System.out.println(");");
        }
    }

    public static void printMethods(Class cl)
    {
        Method[] methods = cl.getDeclaredMethods(); //获取cl的方法声明

        for(Method m : methods)
        {
            String name = m.getName();  //获取方法名
            String modifiers = Modifier.toString(m.getModifiers()); //获取修饰符
            if(modifiers.length() > 0) System.out.print(modifiers + " ");
            System.out.print(name + "(");

            Class[] ParamTypes = m.getParameterTypes(); //获取方法m的所有参数类型
            for(int i = 0 ; i < ParamTypes.length ; i ++)
            {
                if(i > 0) System.out.print(",");
                System.out.printf(ParamTypes[i].getName());
            }
            System.out.println(")");
        }
    }

    public static void printFields(Class cl)
    {
        Field[] fileds = cl.getFields();
        for(Field f : fileds)
        {
            String name = f.getName(); //获取成员名
            Class ftype = f.getType(); //获取成员类型
            String modifiers = Modifier.toString(f.getModifiers()); //获取修饰符
            if(modifiers.length() > 0)
                System.out.print(modifiers + " ");
            System.out.println(ftype.getName() + " " + name + ";");
        }
    }
}
